package br.com.sgi.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;

import br.com.sgi.util.ICombobox;
import br.com.sgi.util.Mensagem;

import com.sun.istack.NotNull;

@Entity
@Table(name="FUNCAO")
@NamedQueries({
@NamedQuery(
	    name="buscarFuncoesPorCoIgreja",
	    query=" SELECT f FROM Funcao f " +
	    	  " WHERE f.igreja.sistema.coSeqSistema =:coSistema" +
	    	  " AND f.igreja.coSeqIgreja = :coIgreja " +
	    	  " order by f.noFuncao" ),
 @NamedQuery(
		    name="buscarFuncoesPorUsers",
		    query=" SELECT f FROM Funcao f " +
	    	  " WHERE f.igreja.sistema.coSeqSistema =:coSistema" +
	    	  " AND (f.igreja.coSeqIgreja = :coIgreja OR f.igreja.coSeqIgreja in(SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username)) " +
	    	  " AND lower(f.noFuncao)  like :nome" +
	    	  " order by f.noFuncao" 
	    	  ),

  @NamedQuery(
 		    name="buscarFuncoesPorIgreja",
 		    query=" SELECT f FROM Funcao f " +
 	    	  " WHERE f.igreja.sistema.coSeqSistema =:coSistema" +
 	    	  " AND (f.igreja.coSeqIgreja = :coIgreja) " +
 	    	  " order by f.noFuncao" 
 	    	  ),
  @NamedQuery(
		    name="buscarTodasFuncoesPorUsers",
		    query=" SELECT f FROM Funcao f " +
	    	  " WHERE f.igreja.sistema.coSeqSistema =:coSistema" +
	    	  " and f.inativo = 'N' " +
	    	  " AND (f.igreja.coSeqIgreja = :coIgreja OR f.igreja.coSeqIgreja in(SELECT ui.igreja.coSeqIgreja from UsersIgreja ui WHERE ui.users.username= :username))" +
	    	  " order by f.noFuncao" 
	    	  )
	    	  
})
public class Funcao implements ICombobox {
	
	private static final long serialVersionUID = 5639147082454358008L;

	@Id
	@Column(name="CO_SEQ_FUNCAO")
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq_funcao_seqfuncao")  
	@SequenceGenerator(name = "seq_funcao_seqfuncao", sequenceName = "SGI.seq_funcao")
	private Long coSeqFuncao;
	
	@Column(name="NO_FUNCAO", length=100)
	private String noFuncao;
	
	@Column(name="DS_FUNCAO", length=300)
	private String dsFuncao;
	
	
//	@Column(name="ST_FUNCAO", length=1)
//	private String statusFuncao;

	@Column(name="INATIVO", length=1)	
	@Type(type = "br.com.sgi.type.SimNaoType")
	private Boolean inativo;

	@NotNull
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name="CO_IGREJA")
	private Igreja igreja; 
	
	@Transient
	private String status;
	
	
	
	public Long getCoSeqFuncao() {
		return coSeqFuncao;
	}

	public void setCoSeqFuncao(Long coSeqFuncao) {
		this.coSeqFuncao = coSeqFuncao;
	}

	public String getNoFuncao() {
		return noFuncao;
	}

	public void setNoFuncao(String noFuncao) {
		this.noFuncao = noFuncao;
	}

	public String getDsFuncao() {
		return dsFuncao;
	}

	public void setDsFuncao(String dsFuncao) {
		this.dsFuncao = dsFuncao;
	}



	@Override
	public Object getValue() {
		return getNoFuncao();
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((coSeqFuncao == null) ? 0 : coSeqFuncao.hashCode());
		return result;
	}


	public Igreja getIgreja() {
		return igreja;
	}

	public void setIgreja(Igreja igreja) {
		this.igreja = igreja;
	}

	public String getStatus() {
		if(inativo)
			status = Mensagem.msg("status.inativo");
		else
			status = Mensagem.msg("status.ativo");
		
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	/**
	 * @return the inativo
	 */
	public Boolean getInativo() {
		return inativo;
	}

	/**
	 * @param inativo the inativo to set
	 */
	public void setInativo(Boolean inativo) {
		this.inativo = inativo;
	}

}
